package com.egg.common.redis.config;

import cn.hutool.core.util.ObjectUtil;
import com.egg.common.redis.util.LockUtil;
import com.egg.common.redis.util.RedisUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * redis 配置类
 */
@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfig {


    /**
     * 服务器地址
     */
    private String host;

    /**
     * 服务器连接端口
     */
    private String port;

    /**
     * 服务器连接密码
     */
    private String password;

    /**
     * 数据库索引
     */
    private String database;


    @Bean
    public RedissonClient initRedissonClient() {
        if (ObjectUtil.isEmpty(getHost()) || ObjectUtil.isEmpty(getPort())) {
            return null;
        }
        Config config = new Config();
        String address = "redis://" + getHost() + ":" + getPort();
        //单节点配置
        config.useSingleServer().setAddress(address);
        if (ObjectUtil.isNotEmpty(getDatabase())) {
            config.useSingleServer().setDatabase(Integer.valueOf(getDatabase()));
        }
        if (ObjectUtil.isNotEmpty(getPassword())) {
            config.useSingleServer().setPassword(getPassword());
        }
        //主从配置
        /*config.useMasterSlaveServers()
            //可以用"rediss://"来启用SSL连接
            .setMasterAddress("redis://127.0.0.1:6379")
            .addSlaveAddress("redis://127.0.0.1:6389", "redis://127.0.0.1:6332", "redis://127.0.0.1:6419")
            .addSlaveAddress("redis://127.0.0.1:6399");*/
        //集群配置
        /*config.useClusterServers()
                .setScanInterval(2000) // 集群状态扫描间隔时间，单位是毫秒
                //可以用"rediss://"来启用SSL连接
                .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
                .addNodeAddress("redis://127.0.0.1:7002");*/
        RedissonClient redissonClient = null;
        try {
            redissonClient = Redisson.create(config);
            log.info("初始化成功 {}", RedissonClient.class.getName());
        } catch (Exception e) {
            log.error("初始化失败 {} 原因 {}", RedissonClient.class.getName(), e.getMessage());
        }
        return redissonClient;
    }

    /**
     * 装配
     *
     * @return
     */
    @Bean
    LockUtil initRedissLockUtil(RedissonClient redissonClient) {
        if (null == redissonClient) {
            //没有初始化 redissonClient 时, 相当于没有配置redis, 无法初始化分布式锁工具类
            log.error("初始化失败 {} 原因 {}", LockUtil.class.getName(), RedissonClient.class.getName() + "为null");
            return new LockUtil();
        }
        LockUtil lockUtil = new LockUtil();
        lockUtil.setRedissonClient(redissonClient);
        log.info("初始化成功 {}", LockUtil.class.getName());
        return lockUtil;
    }

    /**
     * 装配
     *
     * @return
     */
    @Bean
    RedisUtil initRedisUtils(StringRedisTemplate stringRedisTemplate) {
        if (null == stringRedisTemplate) {
            //没有初始化 redissonClient 时, 相当于没有配置redis, 无法初始化分布式锁工具类
            log.error("初始化失败 {} 原因 {}", RedisUtil.class.getName(), StringRedisTemplate.class.getName() + "为null");
            return new RedisUtil();
        }
        RedisUtil redisUtil = new RedisUtil();
        redisUtil.setStringRedisTemplateClient(stringRedisTemplate);
        log.info("初始化成功 {}", RedisUtil.class.getName());
        return redisUtil;
    }


}